#!/usr/bin/env python3
"""
修复GPU服务器COS上传时的ACL权限问题
确保处理后的图片可以通过CDN公开访问
"""

def get_fixed_upload_code():
    """返回修复后的上传代码"""
    
    fixed_code = '''
    def upload_to_cos(self, file_path, file_key):
        """上传文件到COS - 修复版本，支持公开访问"""
        try:
            start_time = time.time()
            
            response = self.client.put_object_from_local_file(
                Bucket=self.cos_config_data['bucket'],
                LocalFilePath=file_path,
                Key=file_key,
                ACL='public-read',  # 关键修复：设置公开读取权限
                Metadata={
                    'upload-time': str(int(time.time())),
                    'source': 'gpu-server',
                    'processed': 'true',
                    'region': self.cos_config_data['region']
                }
            )
            
            upload_time = time.time() - start_time
            logger.info(f"文件上传到COS成功: {file_key}, 耗时: {upload_time:.2f}s")
            
            return {
                'success': True,
                'file_key': file_key,
                'upload_time': upload_time,
                'cos_url': f"https://{self.cos_config_data['internal_domain']}/{file_key}",
                'cdn_url': f"https://{COSConfig.CDN_DOMAIN}/{file_key}",
                'region': self.cos_config_data['region'],
                'bucket': self.cos_config_data['bucket']
            }
            
        except CosServiceError as e:
            logger.error(f"COS上传失败: {e}")
            return {
                'success': False,
                'error': f"COS上传失败: {e.get_error_code()}"
            }
    '''
    
    return fixed_code

def get_alternative_fix():
    """替代方案：使用put_object_acl单独设置权限"""
    
    alternative_code = '''
    def upload_to_cos(self, file_path, file_key):
        """上传文件到COS - 替代修复方案"""
        try:
            start_time = time.time()
            
            # 1. 先上传文件
            response = self.client.put_object_from_local_file(
                Bucket=self.cos_config_data['bucket'],
                LocalFilePath=file_path,
                Key=file_key,
                Metadata={
                    'upload-time': str(int(time.time())),
                    'source': 'gpu-server',
                    'processed': 'true',
                    'region': self.cos_config_data['region']
                }
            )
            
            # 2. 设置公开读取权限
            self.client.put_object_acl(
                Bucket=self.cos_config_data['bucket'],
                Key=file_key,
                ACL='public-read'
            )
            
            upload_time = time.time() - start_time
            logger.info(f"文件上传到COS成功: {file_key}, 耗时: {upload_time:.2f}s")
            
            return {
                'success': True,
                'file_key': file_key,
                'upload_time': upload_time,
                'cos_url': f"https://{self.cos_config_data['internal_domain']}/{file_key}",
                'cdn_url': f"https://{COSConfig.CDN_DOMAIN}/{file_key}",
                'region': self.cos_config_data['region'],
                'bucket': self.cos_config_data['bucket']
            }
            
        except CosServiceError as e:
            logger.error(f"COS上传失败: {e}")
            return {
                'success': False,
                'error': f"COS上传失败: {e.get_error_code()}"
            }
    '''
    
    return alternative_code

if __name__ == "__main__":
    print("🔧 GPU服务器COS ACL权限修复方案")
    print("=" * 50)
    
    print("\n📋 问题分析：")
    print("- GPU服务器上传文件到COS时没有设置ACL权限")
    print("- 导致文件默认是私有的，CDN无法访问")
    print("- 返回403 Forbidden错误")
    
    print("\n🛠️ 修复方案1（推荐）：")
    print("- 在上传时直接设置 ACL='public-read'")
    print("- 代码简单，一次操作完成")
    
    print("\n🛠️ 修复方案2（替代）：")
    print("- 先上传文件，再单独设置ACL权限")
    print("- 分两步操作，更灵活")
    
    print("\n📝 需要在GPU服务器上修改的文件：")
    print("- gpu_server_cos_support.py")
    print("- 修改 upload_to_cos 函数")
    
    print("\n🧪 修复后测试：")
    print("- 重新处理一张图片")
    print("- 检查CDN链接是否可以正常访问")
    print("- 验证403错误是否解决")
